/**
 * 享元模式：
 *    是一种优化程序性能的模式，本质为减少对象创建个数。
 * 
 * 使用情况： 
 *     有大量相似的对象，占用了大量内存。
 *     对象中大部分状态可以抽象为外部状态。
 *  例如：某商家有50种男款内衣和50款女款内衣，要展示他们。
 *  方案一：各造50个塑料男模 和 塑料女模， 让他们穿上展示
 *  方案二：造 1个男模 和 1个女模，分别试穿50款内衣。
 */

/**
 * 模特
 * @param {*} gender 
 */
function Model(gender) { 
    this.gender = gender 
}

Model.prototype.takephoto = function () { 
    console.log(`${this.gender === "male" ? "男模":"女模"} 试穿 ${this.underwear} 。`)
}
const maleModel = new Model("male")
const femaleModel = new Model("female")

/**
for (let i = 0; i < 50; i++) {
    maleModel.underwear = `第${i + 1}款衣服`;
    maleModel.takephoto()
    femaleModel.underwear = `第${i + 1}款衣服`;
    femaleModel.takephoto()
}
**/

/**
 * 优化：
 *   
 */
const modelFactory = (function () {
    const modelGender = {}
    return {
        createModel: function (gender) { 
            if (modelGender[gender]) { 
                return modelGender[gender]
            }
            return modelGender[gender] = new Model(gender)
        }
    }
}())
 
const modelManager = (function () {
    const modelObj = {}
    return {
        add: function(gender, i) {
            modelObj[i] = {
                underwear: `第 ${i + 1} 款衣服`
            }
            return modelFactory.createModel(gender)
        },
        copy: function(model, i) { //优化点二点
            model.underwear = modelObj[i].underwear
        }
    }
}())

for (let i = 0; i < 50; i++) {
    const maleModel = modelManager.add("male", i);
    modelManager.copy(maleModel, i)
    maleModel.takephoto()
}

for (let i = 0; i < 50; i++) {
    const femaleModel = modelManager.add("female", i);
    modelManager.copy(femaleModel, i)
    femaleModel.takephoto()
}